home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-03 / qbasicpg.zip / OTHELLO.BAS < prev    next >
BASIC Source File  |  1980-01-01  |  9KB  |  330 lines

  1. 10 '      OTHELLO
  2. 20 '      PLAYS THE GAME OTHELLO WITH TWO STRATEGIES:
  3. 30 '      1.    TAKE THE MAXIMUM NUMBER OF PIECES
  4. 40 '      2.    ADD A BONUS FOR OUTSIDE POSITION
  5. 50 '      BOARD IS THE ARRAY A, BOUNDED BY 0"S (BLANKS)
  6. 60 '       A = 0 FOR EMPTY SQUARE
  7. 70 '       A = B FOR BLACK SQUARE -- X  (INTERNALLY -1)
  8. 80 '       A = W FOR WHITE SQUARE -- 0  (INTERNALLY +1)
  9. 90 '      I AND J ALWAYS USED FOR ROW/COLUMN INDICES
  10. 100 '      I4 AND J4 STORE INC'ENTS TO THE 8 NEIGHBORS
  11. 110 '      C$ AND D$ STORE CHARACTERS A-H,X,.,0 FOR OUTPUT
  12. 120 DIM A(9,9),Q(8,2),C$(8),D$(3)
  13. 130 '   INITIAL GREETING
  14. 140 PRINT "GREETINGS FROM OTHELLO"
  15. 150 PRINT "DO YOU WANT INSTRUCTIONS  (Y OR N)" ;
  16. 160 INPUT X$
  17. 170 IF X$ = "N" THEN 390
  18. 180 IF X$ <> "Y" THEN 160
  19. 190 PRINT
  20. 200 PRINT "OTHELLO IS PLAYED ON AN 8 X 8 CHECKER BOARD,"
  21. 210 PRINT "ROWS NUMBERED 1 TO 8 AND COLUMNS A TO H."
  22. 220 PRINT "THE INITIAL CONFIGURATION IS ALL BLANK, EXCEPT"
  23. 230 PRINT "FOR THE CENTER FOUR SQUARES, WHICH FORM THE"
  24. 240 PRINT "PATTERN"
  25. 250 PRINT "           0 X"
  26. 260 PRINT "           X 0"
  27. 270 PRINT
  28. 280 PRINT "TRY TO PLACE YOUR PIECE SO THAT IT  OUTFLANK"
  29. 290 PRINT "MINE, CREATING A HORIZONTAL, VERTICAL, OR"
  30. 300 PRINT "DIAGONAL RUN OF MY PIECES BOUNDED AT EACH END"
  31. 310 PRINT "BY AT LEAST ONE OF YOURS. THIS WILL  FLIP  MY"
  32. 320 PRINT "PIECES, TURNING THEM INTO YOURS."
  33. 330 PRINT "NOTE: YOU MUST CAPTURE AT LEAST ONE OF MY"
  34. 340 PRINT "PIECES IN THIS WAY IF IT IS AT ALL POSSIBLE."
  35. 350 PRINT "IF IT IS NOT POSSIBLE, YOU FOREIT YOUR TURN BY"
  36. 360 PRINT "ENTERING 0,0 FOR YOUR (ROW,COL) MOVE."
  37. 370 PRINT
  38. 380 '   INITIALIZE
  39. 390 PRINT "SHOULD I WAIT BEFORE MAKING MY MOVES (Y OR N)" ;
  40. 400 F2 = 0
  41. 410 INPUT X$
  42. 420 IF X$ = "N" THEN 460
  43. 430 IF X$ <> "Y" THEN 410
  44. 440 F2 = 1
  45. 450 PRINT "OK.  TYPING ANY CHARACTER WILL LET ME GO."
  46. 460 PRINT "SHOULD I PLAY MY BEST STRATEGY (Y OR N)" ;
  47. 470 S2 = 0
  48. 480 INPUT X$
  49. 490 IF X$ = "N" THEN 520
  50. 500 IF X$ <> "Y" THEN 480
  51. 510 S2 = 2
  52. 520 B = -1
  53. 530 W = +1
  54. 540 D$(B + 2) = "X"
  55. 550 D$(0 + 2) = "."
  56. 560 D$(W+2) = "0"
  57. 570 FOR K = 1 TO 8
  58. 580 READ Q(K,1)
  59. 590 NEXT K
  60. 600 DATA 0,-1,-1,-1,0,1,1,1
  61. 610 FOR K = 1 TO 8
  62. 620 READ Q(K,2)
  63. 630 NEXT K
  64. 640 DATA 1,1,0,-1,-1,-1,0,1
  65. 650 FOR K = 1 TO 8
  66. 660 READ C$(K)
  67. 670 NEXT K
  68. 680 DATA   "A","B","C","D","E","F","G","H"
  69. 690 '   SET UP A NEW GAME
  70. 700 FOR I = 1 TO 9
  71. 710 FOR J = 1 TO 9
  72. 720 A(I,J) = 0
  73. 730 NEXT J
  74. 740 NEXT I
  75. 750 A(4,4) = W
  76. 760 A(5,5) = W
  77. 770 A(4,5) = B
  78. 780 A(5,4) = B
  79. 790 C1 = 2
  80. 800 H1 = 2
  81. 810 N1 = 4
  82. 820 Z = 0
  83. 830 '   HUMAN"S CHOICES
  84. 840 PRINT "DO YOU WANT TO HAVE X OR 0" ;
  85. 850 C = W
  86. 860 H = B
  87. 870 INPUT X$
  88. 880 IF X$ ="X" THEN 920
  89. 890 IF X$ <> "0" THEN 870
  90. 900 C = B
  91. 910 H = W
  92. 920 PRINT "DO YOU WANT TO GO FIRST (Y OR N)" ;
  93. 930 INPUT X$
  94. 940 IF X$ = "N" THEN 1020
  95. 950 IF X$ <> "Y" THEN 930
  96. 960 '   PRINT INITIAL BOARD
  97. 970 GOSUB 3100
  98. 980 GOTO 1690
  99. 990 '   COMPUTER"S MOVE
  100. 1000 IF F2 = 0 THEN 1020
  101. 1010 INPUT X$
  102. 1020 B1 = -1
  103. 1030 I3 = 0
  104. 1035 J3 = 0
  105. 1040 T1 = C
  106. 1050 T2 = H
  107. 1060 '   SCAN FOR BLANK SQUARE
  108. 1070 FOR I = 1 TO 8
  109. 1080 FOR J = 1 TO 8
  110. 1090 IF A(I,J) <> 0 THEN 1380
  111. 1100 '   FOUND A BLANK SQUARE
  112. 1110 '   DOES IT HAVE AN OPPONENT AS NEIGHBOR
  113. 1120 GOSUB 2620
  114. 1130 IF F1 = 0 THEN 1380
  115. 1140 '   FOUND AN OPPONENT AS A NEIGHBOR
  116. 1150 '   HOW MANY OF HIS PIECES CAN WE FLIP?
  117. 1160 '   (DON"T DO IT NOW)
  118. 1170 U = -1
  119. 1180 GOSUB 2820
  120. 1190 '   EXTRA POINTS FOR BOUNDARY POSITION
  121. 1200 IF S1 = 0 THEN 1380
  122. 1210 IF (I - 1) * (I - 8) <> 0 THEN 1230
  123. 1220 S1 = S1 + S2
  124. 1230 IF (J - 1) * (J - 8) <> 0 THEN 1260
  125. 1240 S1 = S1 + S2
  126. 1250 '   IS THIS BETTER THAN THE BEST FOUND SO FAR
  127. 1260 IF S1 < B1 THEN 1380
  128. 1270 IF S1 > B1 THEN 1340
  129. 1280 '   A TIE; RANDOM DECISION
  130. 1290 '   THE NEXT TWO EXECUTABLE STATEMENTS CAN BE DELETED
  131. 1300 '   FOR A VERSION OF BASIC-WITHOUT RANDOM NUMBERS
  132. 1310 R = RND(1)
  133. 1320 IF R > .5 THEN 1380
  134. 1330 '   YES
  135. 1340 B1 = S1
  136. 1350 I3 = I
  137. 1360 J3 = J
  138. 1370 '   END OF SCAN LOOP
  139. 1380 NEXT J
  140. 1390 NEXT I
  141. 1400 '   COULD WE DO ANYTHING?
  142. 1410 IF B1 > 0 THEN 1480
  143. 1420 '   NO
  144. 1430 PRINT "I HAVE TO FORFEIT MY MOVE"
  145. 1440 IF Z = 1 THEN 2190
  146. 1450 Z = 1
  147. 1460 GOTO 1690
  148. 1470 '   MAKE THE MOVE
  149. 1480 Z = 0
  150. 1490 PRINT "I WILL MOVE TO" ;
  151. 1500 PRINT I3;
  152. 1510 PRINT   ;
  153. 1520 PRINT C$(J3)
  154. 1530 I = I3
  155. 1540 J = J3
  156. 1550 U = 1
  157. 1560 GOSUB 2820
  158. 1570 C1 = C1 + S1 + 1
  159. 1580 H1 = H1 - S1
  160. 1590 N1 = N1 + 1
  161. 1600 PRINT "THAT GIVES ME" ;
  162. 1610 PRINT S1;
  163. 1620 PRINT " OF YOUR PIECES"
  164. 1630 '   PRINT OUT BOARD
  165. 1640 GOSUB 3100
  166. 1650 '   TEST FOR END OF GAME
  167. 1660 IF H1 = 0 THEN 2190
  168. 1670 IF N1 = 64 THEN 2190
  169. 1680 '   HUMAN"S MOVE
  170. 1690 T1 = H
  171. 1700 T2 = C
  172. 1710 PRINT "YOUR MOVE -- (ROW, COL)" ;
  173. 1720 INPUT I, X$
  174. 1730 IF I < 0 THEN 1720
  175. 1740 IF I > 8 THEN 1720
  176. 1750 IF I <> 0 THEN 1820
  177. 1760 PRINT "ARE YOU FORFEITING YOUR TURN (Y OR N) "
  178. 1770 INPUT X$
  179. 1780 IF X$ <> "Y" THEN 1710
  180. 1790 IF Z = 1 THEN 2190
  181. 1800 Z = 1
  182. 1810 GOTO 1000
  183. 1820 FOR J = 1 TO 8
  184. 1830 IF C$(J) = X$ THEN 1870
  185. 1840 NEXT J
  186. 1850 GOTO 1720
  187. 1860 '   CHECK BLANK
  188. 1870 IF A(I,J) = 0 THEN 1910
  189. 1880 PRINT "SORRY, THAT SQUARE IS OCCUPIED; TRY AGAIN"
  190. 1890 GOTO 1720
  191. 1900 '   CHECK FOR LEGAL NEIGHBOR
  192. 1910 GOSUB 2620
  193. 1920 IF F1 = 1 THEN 1970
  194. 1930 PRINT "SORRY, YOU ARE NOT NEXT TO ONE OF MY PIECES;"
  195. 1940 PRINT "TRY AGAIN"
  196. 1950 GOTO 1720
  197. 1960 '   CHECK IF LEGAL RUN
  198. 1970 U = -1
  199. 1980 GOSUB 2820
  200. 1990 IF S1 > 0 THEN 2030
  201. 2000 PRINT "SORRY, THAT DOES NOT FLANK A ROW; TRY AGAIN"
  202. 2010 GOTO 1720
  203. 2020 '   EVERYTHING LEGAL; MAKE HUMAN"S MOVE
  204. 2030 Z = 0
  205. 2040 PRINT "THAT GIVES YOU ";
  206. 2050 PRINT S1;
  207. 2060 PRINT " OF MY PIECES"
  208. 2070 U = 1
  209. 2080 GOSUB 2820
  210. 2090 H1 = H1 + S1 + 1
  211. 2100 C1 = C1 - S1
  212. 2110 N1 = N1 + 1
  213. 2120 '   PRINT OUT BOARD
  214. 2130 GOSUB 3100
  215. 2140 ' TEST FOR END OF GAME
  216. 2150 IF C1 = 0 THEN 2190
  217. 2160 IF N1 = 64 THEN 2190
  218. 2170 GOTO 1000
  219. 2180 '   END OF GAME WRAPUP
  220. 2190 PRINT
  221. 2200 PRINT "YOU HAVE ";
  222. 2210 PRINT H1;
  223. 2220 PRINT " PIECES AND I HAVE ";
  224. 2230 PRINT C1;
  225. 2240 PRINT " PIECES -- ";
  226. 2250 IF H1 = C1 THEN 2290
  227. 2260 IF H1 > C1 THEN 2310
  228. 2270 PRINT "SORRY, I WON THAT ONE."
  229. 2280 GOTO 2320
  230. 2290 PRINT "A TIE !!"
  231. 2300 GOTO 2500
  232. 2310 PRINT "YOU WON !"
  233. 2320 C1 = C1 - H1
  234. 2330 IF C1 > 0 THEN 2350
  235. 2340 C1 = -C1
  236. 2350 C1 = (64 * C1) / N1
  237. 2360 PRINT "THAT WAS A" ;
  238. 2370 IF C1 < 11 THEN 2490
  239. 2380 IF C1 < 25 THEN 2470
  240. 2390 IF C1 < 39 THEN 2450
  241. 2400 IF C1 < 53 THEN 2430
  242. 2410 PRINT "PERFECT GAME."
  243. 2420 GOTO 2500
  244. 2430 PRINT "WALKAWAY."
  245. 2440 GOTO 2500
  246. 2450 PRINT "FIGHT."
  247. 2460 GOTO 2500
  248. 2470 PRINT "HOT GAME !"
  249. 2480 GOTO 2500
  250. 2490 PRINT "SQUEAKER !!"
  251. 2500 PRINT
  252. 2510 PRINT "DO YOU WANT TO PLAY ANOTHER GAME (Y OR N)" ;
  253. 2520 INPUT X$
  254. 2530 IF X$ = "Y" THEN 700
  255. 2540 IF X$ <> "N" THEN 2520
  256. 2550 PRINT "THANKS FOR PLAYING."
  257. 2560 STOP
  258. 2570 '
  259. 2580 '   SUBROUTINE TEST-FOR-PROPER-NEIGHBOR
  260. 2590 '   ASSUMES:
  261. 2600 '       I,J LOCATES A BLANK SQUARE
  262. 2610 '       YOU HOPE TO SEE AN ADJACENT T2 (= -T1)
  263. 2620 FOR I1 = -1 TO 1
  264. 2630 FOR J1 = -1 TO 1
  265. 2632 IF I+I1 < = 0 THEN 2650
  266. 2633 IF J+J1 < = 0 THEN 2650
  267. 2640 IF A(I+I1,J+J1) = T2 THEN 2710
  268. 2650 NEXT J1
  269. 2660 NEXT I1
  270. 2670 '   NO T2 FOUND; FAILURE
  271. 2680 F1 = 0
  272. 2690 RETURN
  273. 2700 '   SUCCESS
  274. 2710 F1 = 1
  275. 2720 RETURN
  276. 2730 '   SUBROUTINE SCORE-AND-UPDATE
  277. 2740 '   ASSUMES:
  278. 2750 '     (I,J) IS A TENTATIVE PLACE FOR A PIECE T1.
  279. 2760 '     WANT RUNS OF T2 = -T1, TERMINATED BY A T1.
  280. 2770 '     IF U IS TRUE (1), MARK THOSE RUNS AS T1"S.
  281. 2780 '     RETURN SUM OF ALL RUNS (T2"S ONLY) IN S1.
  282. 2790 '     MAIN PROGRAM CONTAINS THE FOLLOWING ARRAYS:
  283. 2800 '         I4:   0 -1 -1 -1  0  1  1  1
  284. 2810 '         J4:   1  1  0 -1 -1 -1  0  1
  285. 2820 S1 = 0
  286. 2830 FOR K = 1 TO 8
  287. 2840 I5 = Q(K,1)
  288. 2850 J5 = Q(K,2)
  289. 2860 I6 = I + I5
  290. 2870 J6 = J + J5
  291. 2880 S3 = 0
  292. 2881 IF I6 < = 0 THEN 3070
  293. 2882 IF J6 < = 0 THEN 3070
  294. 2890 IF A(I6,J6) <> T2 THEN 3070
  295. 2900 '   LOOP THROUGH THE RUN
  296. 2910 S3 = S3 + 1
  297. 2920 I6 = I6 + I5
  298. 2930 J6 = J6 + J5
  299. 2932 IF I6 < = 0 THEN 3070
  300. 2933 IF J6 < = 0 THEN 3070
  301. 2940 IF A(I6,J6) = T1 THEN 2970
  302. 2950 IF A(I6,J6) = 0 THEN 3070
  303. 2960 GOTO 2910
  304. 2970 S1 = S1 + S3
  305. 2980 IF U <> 1 THEN 3070
  306. 2990 '   UPDATE BOARD
  307. 3000 I6 = I
  308. 3010 J6 = J
  309. 3020 FOR K1 = 0 TO S3
  310. 3030 A(I6,J6) = T1
  311. 3040 I6 = I6 + I5
  312. 3050 J6 = J6 + J5
  313. 3060 NEXT K1
  314. 3070 NEXT K
  315. 3080 RETURN
  316. 3090 '   SUBROUTINE PRINT-BOARD
  317. 3100 PRINT
  318. 3110 PRINT "    A B C D E F G H"
  319. 3120 FOR I = 1 TO 8
  320. 3130 PRINT I;
  321. 3140 FOR J = 1 TO 8
  322. 3150 PRINT " ";
  323. 3160 PRINT D$(A(I,J)+2);
  324. 3170 NEXT J
  325. 3180 PRINT
  326. 3190 NEXT I
  327. 3200 PRINT
  328. 3210 RETURN
  329. 3220 END
  330.